package com.yangyu.util;

import lombok.extern.slf4j.Slf4j;
import org.springframework.util.FileCopyUtils;
import org.springframework.web.multipart.MultipartFile;

import java.io.*;

/**
 * @author
 * @version V1.0
 * @Package com.yangyu.util
 * @date 2021/1/16 22:56
 */
@Slf4j
public class UploadUtil {

    public static String upload(String path, MultipartFile file) throws IOException {

        //创建输入输出流
        InputStream inputStream = null;
        OutputStream outputStream = null;

        try {
            //获取文件的输入流
            inputStream = file.getInputStream();
            //获取上传时的文件名
            String fileName = file.getOriginalFilename();
            //注意是路径+文件名
            //如果之前的 String path = "d:/upload/" 没有在最后加 / ，那就要在 path 后面 + "/"
            File targetFile = new File(path + fileName);
            targetFile.setWritable(true, false);

            //判断文件父目录是否存在
            log.info(targetFile.getParentFile().getPath());
            if(!targetFile.getParentFile().exists()){
                targetFile.getParentFile().setWritable(true, false);
                targetFile.getParentFile().getParentFile().setWritable(true, false);
                //不存在就创建一个
                boolean mkdir = targetFile.getParentFile().mkdirs();
                log.info("mkdir = " + mkdir);
            }
            if(!targetFile .exists()) {
                targetFile.getParentFile().setWritable(true, false);
                boolean newFile = targetFile.createNewFile();
                targetFile.setWritable(true, false);
                log.info("createNewFile: " + targetFile.getPath() + "-->" + newFile);
            }
            //获取文件的输出流
            outputStream = new FileOutputStream(targetFile);
            //最后使用资源访问器FileCopyUtils的copy方法拷贝文件
            int copy = FileCopyUtils.copy(inputStream, outputStream);
            log.info("拷贝了 " + copy + " bit");
            //上传成功了
            return path + fileName;
        }  finally {
            //无论成功与否，都有关闭输入输出流
            if (inputStream != null) {
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (outputStream != null) {
                try {
                    outputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
